home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
-
- int *partition(int *a,int *b,int c);
-
- int findpivot(int *a,int *b);
- void qsort(int *a,int *b);
-
- /* Hoare's Quicksort in C */
-
- void main()
- {
- int count, value, items, *ptr, *data;
-
- printf("how many values?\n\n");
- scanf("%d",&count);
- ptr=data=malloc(2*count); items=count;
- printf("enter values:\n\n");
-
- /* read values into 'data' array */
-
- while(count>0)
- {
- scanf("%d",&value);
- *ptr=value;
- ptr=ptr+1; count=count-1;
- };
-
- count=items; qsort(data,data+count-1);
- ptr=data; puts("sorted values");
-
- /* print sorted values */
-
- while(count>0)
- {
- printf("%d ",*ptr);
- ptr=ptr+1; count=count-1;
- };
- }
-
-
- void qsort(int *left,int *right)
- {
- int pivot, *k;
-
- pivot = findpivot(left,right); /* find valid pivot */
-
- if(pivot != 0)
- {
- k = partition(left,right,pivot); /* partition data into LH and RH */
- qsort(left,k-1); /* sort items < pivot */
- qsort(k,right); /* sort items >=pivot */
- };
- }
-
-
- int findpivot(int *left, int *right)
- {
- int *s, k;
-
- s=left; k=*s; s=s+1;
- while(s<=right)
- {
- if(*s>k) return *s; /* return largest of first two distinct values */
- if(*s<k) return k;
- s=s+1;
- };
- return 0; /* or zero if all values are same */
- }
-
-
- int *partition(int *left, int *right, int pivot)
- {
- int *lcurs,*rcurs,temp;
-
- lcurs=left; rcurs=right; /* left, right cursors */
-
- for(;;)
- {
- temp=*lcurs; *lcurs=*rcurs; *rcurs=temp; /* swap values */
- while(*lcurs<pivot) lcurs=lcurs+1; /* incr left cursor until value>=pivot */
- while(*rcurs>=pivot) rcurs=rcurs-1; /* decr right cursor until value<pivot */
- if(lcurs>rcurs) return lcurs; /* set partitioned */
- };
- }
-